home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib07.dsk / INCOME TRAC.bas < prev    next >
BASIC Source File  |  2023-02-26  |  21KB  |  477 lines

  1. 10  REM ********************************
  2. 15  REM **          TRAC 'I'          **
  3. 20  REM **     THE INCOME SYSTEM      **
  4. 25  REM **      BY  CHRIS EXNER       **
  5. 30  REM **    COPYRIGHT (C)  1982     **
  6. 35  REM **    BY  MICRO-SPARC INC     **
  7. 40  REM **    LINCOLN, MA.  01773     **
  8. 45  REM ********************************
  9. 72  GOTO 100
  10. 75  REM  REQUIRES APPLESOFT AND 1 DISK.  PARALLEL OR SERIAL PRINTER IS OPTIONAL
  11. 80  REM  ';' PRINTING
  12. 81  PRINT  SPC( PK -SY)V$;
  13. 82 SY = SY +(PK -SY) + LEN(V$)
  14. 83  RETURN 
  15. 85  REM  END OF LINE PRINTING
  16. 86  PRINT  SPC( PK -SY)V$
  17. 87 PK = 0:SY = 0
  18. 88  RETURN 
  19. 100  TEXT : HOME : HTAB 11: PRINT "** INCOME TRAC **
  20. 110  PRINT : PRINT "     THIS SYSTEM ALLOWS YOU TO ENTER"
  21. 120  PRINT "INCOME DATA.  YOU MAY THEN PRODUCE AN "
  22. 130  PRINT "INCOME STATEMENT COMPARING YOUR INCOME"
  23. 140  PRINT "TO YOUR EXPENSES.  THE EXPENSE DATA IS "
  24. 150  PRINT "TAKEN FROM TRAC FILES 'BALANCES',"
  25. 160  PRINT "'CARD #' AND 'CHECK #'."
  26. 175  REM  * ACCEPT OUTPUT DEVICE
  27. 180  VTAB 12: PRINT "ENTER THE REPORT OUTPUT DEVICE": PRINT "YOU WISH TO USE."
  28. 190  HTAB 10: PRINT "1 = SCREEN ONLY"
  29. 195  HTAB 10: PRINT "2 = PRINTER"
  30. 200  VTAB 17: INVERSE : INPUT "ENTER YOUR SELECTION: ";PRTYPE: NORMAL : GOSUB 2300
  31. 205  IF PRTYPE < >1  AND PRTYPE < >2  THEN  GOSUB 2100: GOTO 200
  32. 210  IF PRTYPE = 1  THEN 220
  33. 215  HOME : VTAB 10: PRINT "ENTER PRINTER TYPE:": PRINT : PRINT "1= IDS & CENTRONICS COMPATIBLE": PRINT "2= CENTRONICS 737": PRINT "3= EPSON MX-80": PRINT : INPUT "ENTER SELECTION: ";PB$: IF  VAL(PB$) <0  OR  VAL(PB$) >3  THEN 215
  34. 220  REM  * ACCEPT REPORT DATE
  35. 230  VTAB 20: INVERSE : INPUT "ENTER REPORT DATE (MO,DAY,YR):";RMO,RDY,RYR: NORMAL 
  36. 240  IF (RMO <1  OR RMO >12)  OR RDY >31  THEN  GOSUB 2100: GOTO 230
  37. 300 D$ =  CHR$(4): REM  CTRL-D
  38. 310  DIM ACCT$(49),BAL(49,12)
  39. 330  DIM MNAME$(12),W$(200,6)
  40. 340  DIM WK(300,5),YTD(49),AVG(49),PRCT(49)
  41. 500  ONERR  GOTO 5060
  42. 1000  REM  *** MAIN MENU ***
  43. 1010  HOME : HTAB 13: PRINT "* MAIN MENU *"
  44. 1020  VTAB 4: PRINT "1 = ENTER ACCOUNT NAMES"
  45. 1030  PRINT "2 = ADD INCOME RECORDS"
  46. 1040  PRINT "3 = SORT INCOME RECORDS "
  47. 1050  PRINT "4 = REPORT/LIST OPTIONS"
  48. 1055  PRINT "5 = END"
  49. 1060  VTAB 11: INVERSE : INPUT "ENTER YOUR SELECTION: ";OM: NORMAL 
  50. 1070  IF OM = 1  THEN  GOTO 3000
  51. 1080  IF OM = 2  THEN  GOTO 5000
  52. 1090  IF OM = 3  THEN  GOTO 7000
  53. 1100  IF OM = 4  THEN  GOTO 9000
  54. 1110  IF OM = 5  THEN  END 
  55. 1120  GOSUB 2100: GOTO 1060
  56. 2000  REM  ** GENERAL PURPOSE ROUTINES
  57. 2100  VTAB 23: PRINT "INVALID ENTRY... PLEASE REENTER": RETURN 
  58. 2300  VTAB 23: CALL  -868: RETURN 
  59. 2400 Q = P:P =  ABS(P)
  60. 2410 C = (P > = 10) +(P > = 100) +(P > = 1000) +(P > = 10000)
  61. 2420  IF Q <0  THEN C = C +1
  62. 2430  RETURN 
  63. 2500  REM  *ADD DETAIL FILE
  64. 2501 F$ = "INCOME #"
  65. 2505  ONERR  GOTO 2560
  66. 2510  FLASH : PRINT "READING ";F$;" FILE": NORMAL 
  67. 2515  PRINT D$"OPEN ";F$;",L40"
  68. 2520  PRINT D$"READ ";F$;",R0"
  69. 2525  INPUT R
  70. 2527  IF R = 0  THEN 2555
  71. 2530  FOR X = 1 TO R
  72. 2535  PRINT D$"READ ";F$;",R";X
  73. 2540  INPUT A,CNO$,MO$,DY$,AMT
  74. 2542 MO =  VAL(MO$)
  75. 2545 BAL(A,MO) = BAL(A,MO) +AMT
  76. 2550  NEXT X
  77. 2555  GOTO 2570
  78. 2560  REM  * DETAIL FILE ERR RTN
  79. 2565 ER =  PEEK(222): POKE 216,0: IF ER < >5  THEN  GOTO 2900
  80. 2570  PRINT D$"CLOSE ";F$
  81. 2575  IF SW = 1  THEN SW = 0: GOTO 10040: REM  RETURN TO PROFILE
  82. 2580  IF F$ = "INCOME #"  THEN F$ = "CHECK #": GOTO 2505
  83. 2590  IF F$ = "CHECK #"  THEN F$ = "CARD #": GOTO 2505
  84. 2595  GOTO 9380: REM  RETURN TO INCOME STATEMENT
  85. 2800  VTAB 24: INVERSE : INPUT "HIT RETURN FOR NEXT PAGE";X$: NORMAL : HOME :PGCT = 0
  86. 2810  RETURN 
  87. 2850  POKE 36,8: PRINT "** INCOME STATEMENT **  ";RMO;"/";RDY;"/";RYR
  88. 2860  PRINT : POKE 36,12: PRINT MNAME$(CMO);"     AVG   %AVG   YTD": PRINT :PGCT = 4: RETURN 
  89. 2900  PRINT "CHECK APPLESOFT MANUAL PG.136 FOR ERR."
  90. 2910  PRINT "THE ERROR IS #"; PEEK(222);"LOCATED IN LINE# "; PEEK(218) + PEEK(219) *256
  91. 2920  END 
  92. 3000  REM  ****** LOAD ACCOUNT TABLE ROUTINE
  93. 3010  ONERR  GOTO 3900
  94. 3020  FLASH : PRINT "LOAD ACCOUNTS ": NORMAL :X = 1
  95. 3030  PRINT D$"OPEN ACCOUNTS,L30"
  96. 3040  PRINT D$"READ ACCOUNTS,R0"
  97. 3050  INPUT R
  98. 3060  FOR X = 1 TO 49
  99. 3070  PRINT D$"READ ACCOUNTS,R";X
  100. 3080  INPUT ACCT$(X)
  101. 3090  NEXT X
  102. 3100  PRINT D$"CLOSE ACCOUNTS"
  103. 3110  IF SW = 1  THEN SW = 0: GOTO 5005: REM  ADD INCOME INCOME RCDS
  104. 3120  IF SW = 2  THEN SW = 0: GOTO 9110: REM  LIST ACCTS
  105. 3130  IF SW = 3  THEN SW = 0: GOTO 9385: REM  INCOME ST.
  106. 3140  IF SW = 4  THEN SW = 0: GOTO 10050: REM  PROFILE RPT
  107. 3500  REM  * ENTER ACCOUNT NAME 
  108. 3510  HOME : HTAB 8: PRINT "** ENTER ACCOUNT NAMES **"
  109. 3520  VTAB 4: INVERSE : PRINT "VALID EXPENSE ACCOUNT #'S ARE 1-24 ": PRINT "VALID INCOME ACCOUNT #'S ARE 30-49"
  110. 3525  PRINT "TYPE 'END' FOR MAIN MENU": NORMAL 
  111. 3530  VTAB 9: CALL  -868: INPUT "ACCOUNT NO:";A$: GOSUB 2300
  112. 3540  IF A$ = "END"  THEN  GOTO 3700
  113. 3550 A =  INT( VAL(A$))
  114. 3560  IF A <1  OR (A >24  AND A <30)  OR A >49  THEN  GOSUB 2100: GOTO 3530
  115. 3565  IF ACCT$(A) = ""  THEN  GOTO 3610
  116. 3570  VTAB 11: CALL  -868: PRINT "ACCOUNT NAME: ";ACCT$(A)
  117. 3580  VTAB 23: INVERSE : INPUT "ANY CHANGE? (Y/N) ";X$: NORMAL 
  118. 3590  IF X$ = "N"  THEN  GOTO 3530
  119. 3600  IF X$ < >"Y"  THEN  GOSUB 2100: GOTO 3580
  120. 3610  VTAB 11: CALL  -868: INPUT "ACCOUNT NAME: ";ACCT$(A)
  121. 3620  IF  LEN(ACCT$(A)) <1  OR  LEN(ACCT$(A)) >16  THEN  VTAB 23: PRINT "NAME LENGTH MUST BE 1-16": GOTO 3610
  122. 3630  GOTO 3530
  123. 3700  REM  * WRITE OUT ACCOUNTS
  124. 3710  ONERR  GOTO 2900
  125. 3715  FLASH : PRINT "WRITING ACCOUNTS FILE": NORMAL 
  126. 3720  PRINT D$"OPEN ACCOUNTS,L30"
  127. 3730  PRINT D$"WRITE ACCOUNTS,R0"
  128. 3740  PRINT R
  129. 3750  FOR X = 1 TO 49
  130. 3760  PRINT D$"WRITE ACCOUNTS,R";X
  131. 3770  PRINT ACCT$(X): NEXT X
  132. 3780  PRINT D$"CLOSE ACCOUNTS"
  133. 3790  GOTO 1000: REM  RETURN TO MAIN MENU
  134. 3900  REM  * ACCOUNTS ERROR RTN
  135. 3910 ER =  PEEK(222): POKE 216,0: IF ER < >5  THEN 2900
  136. 3920  PRINT D$"CLOSE ACCOUNTS"
  137. 3930  FOR Y = X TO 49:ACCT$(X) = "": NEXT Y
  138. 3940 R = 49
  139. 3950  GOTO 3110
  140. 5000  REM  ****** ENTER INCOME RECORDS
  141. 5002 SW = 1: GOTO 3000: REM  LOAD ACCT NAMES
  142. 5005  ONERR  GOTO 5060
  143. 5030  PRINT D$"OPEN INCOME #,L40"
  144. 5040  PRINT D$"READ INCOME #,R0"
  145. 5050  INPUT R: GOTO 5080
  146. 5060 ER =  PEEK(222): POKE 216,0: IF ER < >5  THEN  GOTO 2900
  147. 5070 R = 0
  148. 5080  PRINT D$"CLOSE INCOME #"
  149. 5095 I = R
  150. 5100  HOME : HTAB 9: PRINT "* ADD INCOME RECORD *"
  151. 5110  PRINT : FOR X = 30 TO 39: PRINT X;". ";ACCT$(X);: HTAB 20: PRINT X +10;". ";ACCT$(X +10): NEXT X
  152. 5130  PRINT : INVERSE : PRINT "INCOME ACCT #'S ARE 30-49": PRINT "TYPE ACCOUNT #, 'REDO', 'EDIT', OR 'END'": NORMAL 
  153. 5140 I = I +1
  154. 5150  VTAB 18: CALL  -868: PRINT "REC #";I
  155. 5160  VTAB 19: CALL  -868: INVERSE : INPUT "ACCOUNT # ";W$(I,1)
  156. 5170  GOSUB 2300
  157. 5180  IF W$(I,1) = "END"  THEN  NORMAL :I = I -1: GOTO 5400
  158. 5190  IF W$(I,1) = "REDO"  THEN I = I -1: GOTO 5150
  159. 5200  IF W$(I,1) = "EDIT"  THEN IS = I: INPUT "RECORD # TO EDIT? ";I:W$(IS,1) = "": GOTO 5150
  160. 5210 W =  VAL(W$(I,1)): IF W <30  OR W >50  THEN  GOSUB 2100: GOTO 5160
  161. 5220 W$(I,2) = "0": REM  FOR CONSISTANCY W/ OTHER TRAC DATA FILES, THE CARD/CHECK FIELD IS PLACE-HELD.
  162. 5230  VTAB 20: CALL  -868: INPUT "MONTH,DAY:";W$(I,3),W$(I,4)
  163. 5240  GOSUB 2300
  164. 5250 WM =  VAL(W$(I,3)):WD =  VAL(W$(I,4)): IF WM <1  OR WM >12  OR WD >31  THEN  GOSUB 2100: GOTO 5230
  165. 5260  VTAB 21: CALL  -868: PRINT "REFERENCE: ";: NORMAL : PRINT "--------------";: HTAB 12: INVERSE : INPUT "";W$(I,6)
  166. 5270  GOSUB 2300
  167. 5280  IF W$(I,6) = ""  THEN W$(I,6) = " "
  168. 5290  IF  LEN(W$(I,6)) <1  OR  LEN(W$(I,6)) >14  THEN  VTAB 24: PRINT "MAX 14 CHAR ALLOWED... PLEASE REENTER": GOTO 5260
  169. 5300  VTAB 22: CALL  -868: INPUT "AMOUNT: ";W$(I,5)
  170. 5310  GOSUB 2300
  171. 5320  IF  ASC(W$(I,5)) <48  OR  ASC(W$(I,5)) >57  THEN  VTAB 24: PRINT "NOT A NUMBER...PLEASE REENTER": GOTO 5300
  172. 5330  VTAB 17: CALL  -958: PRINT "LAST ACCT=";W$(I,1);"  MONTH= ";W$(I,3);"  AMT=$";W$(I,5)
  173. 5340  IF IS >0  THEN X = I: GOSUB 5400:I = IS:IS = 0: GOTO 5150
  174. 5380  GOTO 5140
  175. 5400  REM  * WRITE INCOME RECORDS
  176. 5410  PRINT D$"OPEN INCOME #,L40"
  177. 5420  IF IS >0  THEN 5460: REM  DIRECT EDIT
  178. 5430  PRINT D$"WRITE INCOME #,R0"
  179. 5440  PRINT I
  180. 5450  FOR X = R +1 TO I
  181. 5460  PRINT D$"WRITE INCOME #,R";X
  182. 5470  PRINT W$(X,1): PRINT W$(X,2): PRINT W$(X,3): PRINT W$(X,4): PRINT W$(X,5): PRINT W$(X,6)
  183. 5880  IF IS >0  THEN 5900
  184. 5890  NEXT X
  185. 5900  PRINT D$;"CLOSE INCOME #"
  186. 5910  IF IS >0  THEN  RETURN 
  187. 5915  IF SW = 2  THEN SW = 0: GOTO 7440: REM  RETURN TO SORT RTN
  188. 5920  GOTO 1000: REM  RETURN TO MAIN MENU
  189. 7000  REM  ****** SORT INCOME RECORDS
  190. 7010  REM  * READ INCOME FILE RTN
  191. 7015 R = 0: ONERR  GOTO 7104
  192. 7020  FLASH : PRINT "READING INCOME #": NORMAL 
  193. 7030  PRINT D$"OPEN INCOME #,L40"
  194. 7040  PRINT D$"READ INCOME #,R0"
  195. 7050  INPUT R
  196. 7060  IF R = 0  THEN  GOTO 7106
  197. 7070  FOR X = 1 TO R
  198. 7080  PRINT D$"READ INCOME #,R";X
  199. 7090  INPUT W$(X,1),W$(X,2),W$(X,3),W$(X,4),W$(X,5),W$(X,6)
  200. 7100  NEXT X
  201. 7102  GOTO 7110
  202. 7104 ER =  PEEK(222): POKE 216,0: IF ER < >5  OR R < >0  THEN  GOTO 2900
  203. 7106  INVERSE : PRINT "NO RECORDS STORED IN INCOME# FILE": NORMAL : FOR X = 1 TO 1500: NEXT X: GOTO 1000
  204. 7110  PRINT D$"CLOSE INCOME #"
  205. 7120  IF SW = 1  THEN SW = 0: GOTO 9820
  206. 7200  REM  * ENTER SORT PARAMETERS
  207. 7205  HOME : HTAB 7: PRINT "*  ENTER SORT PARAMETERS *"
  208. 7210  PRINT : PRINT "WHICH FIELD DO YOU WANT TO SORT ON?"
  209. 7220  HTAB 10: PRINT "1 = ACCOUNT NUMBER"
  210. 7230  HTAB 10: PRINT "3 = MONTH"
  211. 7240  HTAB 10: PRINT "5 = DOLLAR AMOUNT"
  212. 7250  VTAB 7: INVERSE : INPUT "ENTER YOUR SELECTION: ";SR: NORMAL 
  213. 7260  IF SR = 1  THEN A$ = "BY ACCOUNT NUMBER"
  214. 7270  IF SR = 3  THEN A$ = "BY MONTH"
  215. 7275  IF SR = 5  THEN A$ = "BY DOLLAR AMOUNT"
  216. 7280  IF SR < >1  AND SR < >3  AND SR < >5  THEN  GOSUB 2100: GOTO 7250
  217. 7285  FLASH : PRINT "INITIALIZING SORT VARIABLES": NORMAL 
  218. 7290 H = 0:K = 0:J = 0:V = 0:CM = 0:F = 0
  219. 7295  FOR X = R +1 TO 300: FOR N = 1 TO 5:WK(X,N) = 0: NEXT N,X
  220. 7300  FOR X = 1 TO R: FOR N = 1 TO 5:WK(X,N) =  VAL(W$(X,N)): NEXT N,X: REM  CONVERT STRINGS TO DIGITS
  221. 7305  FLASH : PRINT "SORT IN PROGRESS": NORMAL 
  222. 7310 M = R: REM  ** SORT ROUTINE
  223. 7312 M =  INT(M/2): IF M = 0  THEN 7395
  224. 7320 J = 1:K = R -M
  225. 7325 H = J
  226. 7330 V = H +M:CM = CM +1
  227. 7340  IF WK(H,SR) <WK(V,SR)  THEN 7387
  228. 7350  FOR F = 1 TO 5
  229. 7355 TK = WK(H,F):WK(H,F) = WK(V,F):WK(V,F) = TK
  230. 7370  NEXT F
  231. 7372 T$ = W$(H,6):W$(H,6) = W$(V,6):W$(V,6) = T$
  232. 7375 H = H -M
  233. 7380  IF H <1  THEN 7387
  234. 7385  GOTO 7330
  235. 7387 J = J +1
  236. 7389  IF J >K  THEN 7312
  237. 7391  GOTO 7325
  238. 7395  FLASH : PRINT "SORT COMPLETED": NORMAL 
  239. 7400  FOR X = 1 TO R: FOR N = 1 TO 5:W$(X,N) =  STR$(WK(X,N)): NEXT N,X:I = R
  240. 7410 I = R:R = 0:IS = 0: VTAB 10: PRINT "SAVE SORTED LIST ON THE DISK? ": INVERSE : INPUT "ENTER 'Y' OR 'N': ";X$: NORMAL : GOSUB 2300
  241. 7420  IF X$ = "Y"  THEN SW = 2: GOTO 5400: REM  WRITE INCOME RCDS
  242. 7430  IF X$ < >"Y"  AND X$ < >"N"  THEN  GOSUB 2100: GOTO 7410
  243. 7440 R = I: VTAB 13: PRINT "PRINT SORTED LIST ON PRINTER? ": INVERSE : INPUT "ENTER 'Y' OR 'N': ";X$: NORMAL : GOSUB 2300
  244. 7450  IF X$ = "Y"  THEN  GOTO 9820
  245. 7460  IF X$ < >"Y"  AND X$ < >"N"  THEN  GOSUB 2100: GOTO 7440
  246. 7470  GOTO 1000: REM  MAIN MENU
  247. 9000  REM  ****** REPORT OPTIONS
  248. 9010  HOME : HTAB 10: PRINT "** REPORT OPTIONS **"
  249. 9020  PRINT : PRINT "1 = LIST ACCOUNTS"
  250. 9025  PRINT "2 = LIST INCOME RECORDS"
  251. 9030  PRINT "3 = INCOME STATEMENT"
  252. 9040  PRINT "4 = YTD INCOME PROFILE"
  253. 9050  VTAB 8: INVERSE : INPUT "ENTER SELECTION: ";RP: NORMAL : GOSUB 2300
  254. 9055  IF RP = 1  THEN  GOTO 9100
  255. 9060  IF RP = 2  THEN  GOTO 9800
  256. 9065  IF RP < >3  AND RP < >4  THEN  GOSUB 2100: GOTO 9050
  257. 9067  RESTORE : FOR X = 1 TO 12: READ MNAME$(X): NEXT X
  258. 9068  IF RP = 4  THEN  GOTO 10000: REM  PROFILE RPT
  259. 9069  VTAB 9: PRINT "%AVG COLUMN IS (CURRMO -AVG MO)/AVG MO"
  260. 9070 BMO = 1: REM  CHANGE THIS LINE TO FIT YOUR FISCAL YEAR SET-UP
  261. 9075  VTAB 11: PRINT "YOUR FISCAL YEAR BEGINS WITH ";MNAME$(BMO)
  262. 9080  VTAB 14: INVERSE : INPUT "ENTER THE CURRENT MONTH#: ";CMO: GOSUB 2300: VTAB 16
  263. 9085 CMO =  INT(CMO): IF CMO <1  OR CMO >12  THEN  GOSUB 2100: GOTO 9080
  264. 9090  GOTO 9300: REM  INCOME STATE.
  265. 9100  REM  ** LIST ACCOUNTS
  266. 9105 SW = 2: GOTO 3000: REM  LOAD ACCT NAMES
  267. 9110  IF PRTYPE = 2  THEN  GOTO 9200: REM  LIST ACCOUNTS ON PRINTER
  268. 9115  REM  * LIST ACCTS ON SCREEN
  269. 9120 A = 0
  270. 9125  HOME : HTAB 11: PRINT "* LIST ACCOUNTS *"
  271. 9130  PRINT : PRINT "ACCT#     ACCT NAME"
  272. 9135  FOR X = 0 TO 39: PRINT "=";: NEXT X: PRINT 
  273. 9140 PGCT = 0
  274. 9145 PGCT = PGCT +1
  275. 9150  IF PGCT >17  THEN  VTAB 24: INVERSE : INPUT "HIT RETURN FOR NEXT PAGE ";X$: NORMAL : GOTO 9125
  276. 9155 A = A +1
  277. 9160  IF A >49  THEN  GOTO 9175
  278. 9165  IF ACCT$(A) = ""  THEN  GOTO 9155: REM  SKIP UNUSED ACCTS
  279. 9170  HTAB 3: PRINT A;: HTAB 9: PRINT ACCT$(A): GOTO 9145
  280. 9175  VTAB 24: INVERSE : INPUT "HIT RETURN FOR MAIN MENU";X$: NORMAL : GOTO 1000
  281. 9200  REM  ** LIST ACCTS ON PRINTER
  282. 9205  PRINT D$;"PR#1"
  283. 9210  PRINT  CHR$(9);"40N"
  284. 9215  PRINT  CHR$(2); CHR$(30)
  285. 9220  PRINT  TAB( 11);"* LIST ACCOUNTS *     ";RMO;"/";RDY;"/";RYR
  286. 9230  PRINT : PRINT "ACCT#     ACCT NAME"
  287. 9235  FOR X = 1 TO 39: PRINT "=";: NEXT X: PRINT 
  288. 9240  FOR A = 1 TO 49
  289. 9245  IF ACCT$(A) = ""  THEN  GOTO 9260: REM  SKIP UNUSED ACCTS
  290. 9250  POKE 36,3: PRINT A;
  291. 9255  POKE 36,9: PRINT ACCT$(A)
  292. 9260  NEXT A
  293. 9265  PRINT  CHR$(9);"40N"
  294. 9270  PRINT D$;"PR#0"
  295. 9275  TEXT : GOTO 1000: REM  RETURN TO MAIN MENU    
  296. 9300  REM  * INCOME STATEMENT
  297. 9305  REM  * GATHER ACTUAL EXPENSES RTN
  298. 9307  FOR X = 30 TO 49: FOR N = 1 TO 12:BAL(X,N) = 0: NEXT N,X
  299. 9310  REM  * READ YTD BALANCES
  300. 9315  ONERR  GOTO 9355
  301. 9320  FLASH : PRINT "READING YEAR-TO-DATE FILES": NORMAL 
  302. 9325  PRINT D$"OPEN BALANCES"
  303. 9330  PRINT D$"READ BALANCES"
  304. 9335  FOR X = 1 TO 24: FOR N = 1 TO 12
  305. 9340  INPUT BAL(X,N)
  306. 9345  NEXT N,X
  307. 9350  GOTO 9365
  308. 9355  REM  YTD ERROR RTN
  309. 9360 ER =  PEEK(222): POKE 216,0: IF ER < >5  THEN 2900
  310. 9365  PRINT D$"CLOSE BALANCES"
  311. 9370  GOTO 2500: REM  ADD DETAIL FILES
  312. 9380 SW = 3: GOTO 3000: REM  LOAD ACCT NAMES
  313. 9385  REM  *CALC YTD AMTS
  314. 9390  FOR A = 1 TO 49
  315. 9392 YTD(A) = 0
  316. 9395  IF BMO < = CMO  THEN  FOR M = BMO TO CMO:YTD(A) = YTD(A) +BAL(A,M): NEXT M
  317. 9400  IF BMO >CMO  THEN  FOR M = BMO TO 12:YTD(A) = YTD(A) +BAL(A,M): NEXT M: FOR M = 1 TO CMO:YTD(A) = YTD(A) +BAL(A,M): NEXT M
  318. 9405  NEXT A
  319. 9410  IF BMO < = CMO  THEN MCT = (CMO -BMO) +1
  320. 9415  IF BMO >CMO  THEN MCT = (13 -BMO) +CMO
  321. 9420  FOR A = 1 TO 49: REM  CALC AVG MONTHS & PERCENTAGES
  322. 9425 AVG(A) =  INT((YTD(A)/MCT) +.5)
  323. 9430 PRCT(A) = 0: IF AVG(A) < >0  THEN PRCT(A) = (BAL(A,CMO) -AVG(A))/AVG(A)
  324. 9435 PRCT(A) =  INT(PRCT(A) *100 +.5)
  325. 9440  NEXT A
  326. 9442  REM  * PRINT INCOME STATEMENT
  327. 9445  IF PRTYPE = 1  THEN  HOME : GOTO 9455: REM  SKIP TURNING PRINTER ON
  328. 9447  PRINT D$;"PR#1"
  329. 9450  PRINT  CHR$(9);"40N"
  330. 9452  PRINT  CHR$(2); CHR$(30)
  331. 9455  GOSUB 2850: REM  PAGE HEADING
  332. 9460  POKE 36,0: PRINT "## INCOME ##": PRINT " ":PGCT = PGCT +2
  333. 9465 TC = 0:TY = 0:TA = 0: REM  INIT GROSS INCOME LINES
  334. 9470  FOR A = 30 TO 49: GOSUB 9600: NEXT A
  335. 9475 IC = TC:IY = TY:IA = TA: REM  SAVE GROSS TOTALS
  336. 9480 TD = 0: IF IA < >0  THEN TD =  INT((IC -IA)/IA *100)
  337. 9485  PRINT "*GROSS";
  338. 9490  HTAB 10: FOR X = 11 TO 39: PRINT "=";: NEXT X: PRINT 
  339. 9495 PK = 0:V$ = "*INCOME*": GOSUB 80: GOSUB 9665:PGCT = PGCT +2
  340. 9500  IF PRTYPE = 1  AND PGCT >16  THEN  GOSUB 2800: GOSUB 2850
  341. 9502  PRINT " ": PRINT "## EXPENSES ##": PRINT :PGCT = PGCT +3
  342. 9505 TA = 0:TC = 0:TY = 0
  343. 9510  FOR A = 1 TO 24: GOSUB 9600: NEXT A
  344. 9515 EC = TC:EY = TY:EA = TA: REM  SAVE TOTAL EXPENSES
  345. 9520 TD = 0: IF EA < >0  THEN TD =  INT((EC -EA)/EA *100)
  346. 9525  PRINT "*TOTAL";
  347. 9530  HTAB 10: FOR X = 11 TO 39: PRINT "=";: NEXT X: PRINT " "
  348. 9540 PK = 0:V$ = "*EXPENSE*": GOSUB 80: GOSUB 9665:PGCT = PGCT +2
  349. 9545  IF PRTYPE = 1  AND PGCT >18  THEN  GOSUB 2800: GOSUB 2850
  350. 9550 TC = IC -EC:TC =  INT(TC *100 +.5)/100
  351. 9551 TA = IA -EA:TA =  INT(TA *100 +.5)/100
  352. 9552 TY = IY -EY:TY =  INT(TY *100 +.5)/100
  353. 9555 TD = 0: IF TA < >0  THEN TD = ((TC -TA)/TA) *100
  354. 9557 TD =  INT(TD +.5)
  355. 9560  PRINT " ": PRINT "*NET";
  356. 9565  HTAB 10: FOR X = 11 TO 39: PRINT "*";: NEXT X: PRINT 
  357. 9570 PK = 0:V$ = "*INCOME*": GOSUB 80: GOSUB 9665
  358. 9575  HTAB 10: FOR X = 11 TO 39: PRINT "*";: NEXT X: PRINT " "
  359. 9577  IF PRTYPE = 2  THEN  GOTO 9590
  360. 9580  VTAB 24: INVERSE : PRINT "ANY KEY FOR MENU, 'ESC' FOR 1ST PAGE";: GET X$: NORMAL 
  361. 9582  IF  ASC(X$) = 27  THEN  GOTO 9442
  362. 9585  TEXT : GOTO 1000: REM  MAIN MENU
  363. 9590  PRINT  CHR$(9);"40N"
  364. 9592  PRINT D$;"PR#0"
  365. 9595  TEXT : GOTO 1000
  366. 9600  REM  PRINT DETAIL LINES
  367. 9605  IF ACCT$(A) = ""  AND YTD(A) = 0  THEN  RETURN 
  368. 9610 PK = 1:V$ =  STR$(A): GOSUB 80
  369. 9612 PK = 4:V$ =  LEFT$(ACCT$(A),6): GOSUB 80
  370. 9613 BAL(A,CMO) =  INT(BAL(A,CMO) *100 +.05)/100
  371. 9615 P = BAL(A,CMO): GOSUB 2400:PK = 14 -C:V$ =  STR$(BAL(A,CMO)): GOSUB 80
  372. 9620 TC = TC +BAL(A,CMO)
  373. 9625 P = AVG(A): GOSUB 2400:PK = 22 -C:V$ =  STR$(AVG(A)): GOSUB 80
  374. 9630 TA = TA +AVG(A)
  375. 9635 P = PRCT(A): GOSUB 2400:PK = 29 -C:V$ =  STR$(PRCT(A)): GOSUB 80
  376. 9640 P = YTD(A): GOSUB 2400:PK = 35 -C:V$ =  STR$(YTD(A)): GOSUB 85
  377. 9645 TY = TY +YTD(A)
  378. 9650 PGCT = PGCT +1: IF PRTYPE = 1  AND PGCT >20  THEN  GOSUB 2800: GOSUB 2850
  379. 9655  RETURN 
  380. 9665  REM  *PRINT TOTAL LINES
  381. 9670 P = TC: GOSUB 2400:PK = 14 -C:V$ =  STR$(TC): GOSUB 80
  382. 9675 P = TA: GOSUB 2400:PK = 22 -C:V$ =  STR$(TA): GOSUB 80
  383. 9680 P = TD: GOSUB 2400:PK = 29 -C:V$ =  STR$(TD): GOSUB 80
  384. 9685 P = TY: GOSUB 2400:PK = 35 -C:V$ =  STR$(TY): GOSUB 85
  385. 9690  RETURN 
  386. 9800  REM  ** LIST INCOME RECORDS
  387. 9810 SW = 1: GOTO 7010: REM  GET INCOME RCDS
  388. 9820  IF PRTYPE = 1  THEN  HOME : GOTO 9860: REM  SKIP TURNING ON PRINTER
  389. 9830  PRINT D$;"PR#1"
  390. 9840  PRINT  CHR$(9);"40N"
  391. 9845  IF PB$ = "1"  THEN  PRINT  CHR$(2); CHR$(30)
  392. 9850  IF PB$ = "2"  THEN  PRINT  CHR$(27); CHR$(19)
  393. 9855  IF PB$ = "3"  THEN  PRINT  CHR$(30)
  394. 9860 A = 0:TA = 0
  395. 9865  IF PRTYPE = 1  THEN  HOME : GOTO 9875: REM  SKIP TURNING ON PRINTER
  396. 9868  PRINT D$;"PR#1"
  397. 9870  PRINT  CHR$(9);"40N"
  398. 9872  PRINT  CHR$(2); CHR$(30)
  399. 9875 A = 0:TA = 0
  400. 9880  PRINT  TAB( 11);"* INCOME RECORDS *";"   ";RMO;"/";RDY;"/";RYR
  401. 9885  IF OM = 3  THEN  PRINT  TAB( 7);"SORTED ";A$
  402. 9890  PRINT : PRINT "#   * REFERENCE *  A#  MM/DD     AMT"
  403. 9895  FOR X = 1 TO 40: PRINT "=";: NEXT X: PRINT 
  404. 9900 PGCT = 0
  405. 9905 PGCT = PGCT +1
  406. 9910  IF PRTYPE = 1  AND PGCT >16  THEN  GOSUB 2800: HOME : GOTO 9880: REM  NEW PAGE
  407. 9915 A = A +1: IF A >R  THEN  GOTO 9955
  408. 9920 PK = 1:V$ =  STR$(A): GOSUB 80
  409. 9925 PK = 5:V$ = W$(A,6): GOSUB 80
  410. 9930 PK = 20:V$ = W$(A,1): GOSUB 80
  411. 9935 PK = 24:V$ = W$(A,3) +"/" +W$(A,4): GOSUB 80
  412. 9940 W =  VAL(W$(A,5)):TA = TA +W
  413. 9945 P = W: GOSUB 2400:PK = 36 -C:V$ =  STR$(W): GOSUB 85
  414. 9950  GOTO 9905
  415. 9955  PRINT :PK = 22:V$ = "*TOTALS*": GOSUB 80
  416. 9960 P = TA: GOSUB 2400:PK = 36 -C:V$ =  STR$(TA): GOSUB 85
  417. 9965  IF PRTYPE = 1  THEN  VTAB 24: INVERSE : INPUT "HIT RETURN FOR MAIN MENU";X$: NORMAL : TEXT : GOTO 1000
  418. 9970  PRINT  CHR$(9);"40N"
  419. 9975  PRINT D$;"PR#0"
  420. 9980  TEXT : GOTO 1000
  421. 10000  REM  ****** INCOME PROFILE
  422. 10010  TEXT : FOR X = 30 TO 49: FOR N = 1 TO 12:BAL(X,N) = 0: NEXT N,X
  423. 10020  FOR X = 1 TO 12:YTD(X) = 0: NEXT X: REM  USE FOR MONTH TOTALS
  424. 10030 SW = 1: GOTO 2500: REM  ADD INCOME DETAIL
  425. 10040 SW = 4: GOTO 3000: REM  LOAD ACCT NAMES
  426. 10050  IF PRTYPE = 1  THEN  GOSUB 12000: REM  SCREEN PROFILE RPT
  427. 11000  REM  *** PRINTER PROFILE REPORT
  428. 11010  PRINT D$;"PR#1"
  429. 11020  PRINT  CHR$(9);"130N"
  430. 11025  IF PB$ = "1"  THEN  PRINT  CHR$(2); CHR$(31)
  431. 11030  IF PB$ = "2"  THEN  PRINT  CHR$(27); CHR$(20)
  432. 11035  IF PB$ = "3"  THEN  PRINT  CHR$(15)
  433. 11100 PK = 50:V$ = "YEAR-TO-DATE INCOME PROFILE   " + STR$(RMO) +"/" + STR$(RDY) +"/" + STR$(RYR): GOSUB 85
  434. 11110  POKE 36,0: PRINT : PRINT "INCOME DESCR' "; TAB( 10);MNAME$(1);
  435. 11120  FOR X = 2 TO 12: PRINT  TAB( 07);MNAME$(X);: NEXT X: PRINT 
  436. 11130  FOR X = 1 TO 130: PRINT "=";: NEXT X: PRINT 
  437. 11200  FOR A = 30 TO 49
  438. 11210  IF ACCT$(A) = ""  THEN Y = 0: FOR X1 = 1 TO 12:Y = BAL(A,X1) +Y: NEXT X1: IF Y = 0  THEN  GOTO 11280
  439. 11220 PK = 1:V$ = ACCT$(A): GOSUB 80
  440. 11230  FOR X = 1 TO 12
  441. 11235 BAL(A,X) =  INT(BAL(A,X) *100 +.05)/100
  442. 11240  IF BAL(A,X) = 0  THEN  GOTO 11270
  443. 11250 P = BAL(A,X): GOSUB 2400:PK = (X *9) +15 -C:V$ =  STR$(BAL(A,X)): GOSUB 80
  444. 11260 YTD(X) = YTD(X) +BAL(A,X)
  445. 11270  NEXT X:PK = 0:SY = 0: PRINT 
  446. 11280  NEXT A
  447. 11290  FOR X = 1 TO 130: PRINT "=";: NEXT X: PRINT 
  448. 11300 PK = 1:V$ = "** TOTALS **": GOSUB 80
  449. 11310  FOR X = 1 TO 12:P = YTD(X): GOSUB 2400:PK = (X *9) +15 -C:V$ =  STR$(YTD(X)): GOSUB 80: NEXT X:PK = 0:SY = 0: PRINT 
  450. 11335  IF PB$ = "1"  THEN  PRINT  CHR$(2); CHR$(30): REM  TURN OFF CONDENSED PRINT
  451. 11340  IF PB$ = "2"  THEN  PRINT  CHR$(27); CHR$(19)
  452. 11345  IF PB$ = "3"  THEN  PRINT  CHR$(146): REM   TURN OFF CONDENSED PRINT 
  453. 11350  PRINT  CHR$(9);"40N"
  454. 11360  PRINT D$;"PR#0"
  455. 11400  TEXT : GOTO 1000
  456. 12000  REM  *** SCREEN PROFILE REPORT
  457. 12010  FOR X = 1 TO 12  STEP 3
  458. 12020  HOME : HTAB 8: PRINT "** YTD INCOME PROFILE **": PRINT 
  459. 12030  PRINT "INCOME DESC    ";MNAME$(X);"       ";MNAME$(X +1);"       ";MNAME$(X +2): PRINT 
  460. 12040  FOR A = 30 TO 49
  461. 12050  IF ACCT$(A) = ""  THEN Y = 0: FOR X1 = X TO (X +2):Y = Y +BAL(A,X1): NEXT X1: IF Y = 0  THEN  GOTO 12130
  462. 12060 PK = 0:V$ =  LEFT$(ACCT$(A),12): GOSUB 80
  463. 12070 P = BAL(A,X): GOSUB 2400:PK = 16 -C:V$ =  STR$(BAL(A,X)): GOSUB 80
  464. 12080 P = BAL(A,X +1): GOSUB 2400::PK = 26 -C:V$ =  STR$(BAL(A,X +1)): GOSUB 80
  465. 12090 P = BAL(A,X +2): GOSUB 2400:PK = 36 -C:V$ =  STR$(BAL(A,X +2)): GOSUB 85
  466. 12100 YTD(X) = YTD(X) +BAL(A,X)
  467. 12110 YTD(X +1) = YTD(X +1) +BAL(A,X +1)
  468. 12120 YTD(X +2) = YTD(X +2) +BAL(A,X +2)
  469. 12130  NEXT A
  470. 12200  PRINT " ":PK = 0:V$ = "** TOTALS **": GOSUB 80
  471. 12205 P = YTD(X): GOSUB 2400:PK = 16 -C:V$ =  STR$(YTD(X)): GOSUB 80
  472. 12210 P = YTD(X +1): GOSUB 2400:PK = 26 -C:V$ =  STR$(YTD(X +1)): GOSUB 80
  473. 12220 P = YTD(X +2): GOSUB 2400:PK = 36 -C:V$ =  STR$(YTD(X +2)): GOSUB 85
  474. 12240  VTAB 23: INVERSE : PRINT "HIT ANY KEY TO CONTINUE";: GET X$: NORMAL 
  475. 12250  NEXT X
  476. 12300  TEXT : GOTO 1000
  477. 20000  DATA  JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC